/**
 * Copyright 2000 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 */
package self.amigo.editor.sheet;

import java.awt.BorderLayout;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import self.amigo.editor.APropertySheet;
import self.amigo.editor.cmd.PropertiesChange;
import self.amigo.elem.ButtonView;
import self.awt.layout.VerticalFlowLayout;
import self.gee.IEditableElement;
import self.gee.editor.IPropertySheet;
import self.lang.BooleanUtils;

public class ButtonSheet extends APropertySheet implements IPropertySheet {
	
	/**
	 * If the internal state of this class ever changes in such a way that it can't be defaulted,
	 * then the {@link #serialVersionUID} should be incremented to ensure serialized instances cleanly fail.  
	 */
	private static final long serialVersionUID = 1;
	
  JTabbedPane         propertySheet = new JTabbedPane();
  BorderLayout        contentPaneLayout = new BorderLayout();
  JPanel              generalTab = new JPanel();
  VerticalFlowLayout  generalPaneLayout = new VerticalFlowLayout();
  JPanel              generalPane = new JPanel();
  JScrollPane         generalScroller = new JScrollPane();
  BorderLayout        generalLayout = new BorderLayout();

  JLabel              labelLabel = new JLabel();
  JTextField          label = new JTextField();
  
  ButtonGroup         btnGroup = new ButtonGroup();
  JRadioButton        pushButtonType = new JRadioButton();
  JRadioButton        checkBoxButtonType = new JRadioButton();
  JRadioButton        radioButtonType = new JRadioButton();

  JCheckBox           selected = new JCheckBox();
  JCheckBox           trailingText = new JCheckBox();

  JLabel aidLinkLabel = new JLabel();
  JTextField aidLink = new JTextField();
  
  private IEditableElement view;

  public ButtonSheet() {
    try {
      jbInit();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
  
  private void jbInit() throws Exception {
    this.setLayout(contentPaneLayout);

    aidLinkLabel.setDisplayedMnemonic('0');
    aidLinkLabel.setText("aid");    
    
    labelLabel.setText("label");
    labelLabel.setDisplayedMnemonic('L');
    labelLabel.setLabelFor(label);

    btnGroup.add( pushButtonType );
    btnGroup.add( checkBoxButtonType );
    btnGroup.add( radioButtonType );
    
    pushButtonType.setText("push button");
//    pushButtonType.setHorizontalTextPosition(SwingConstants.LEADING);
    checkBoxButtonType.setText("check box button");
//    checkBoxButtonType.setHorizontalTextPosition(SwingConstants.LEADING);
    radioButtonType.setText("radio button");
//    radioButtonType.setHorizontalTextPosition(SwingConstants.LEADING);

    selected.setText("show as selected");
    
    trailingText.setText("label trails status");

    generalPane.setLayout(generalPaneLayout);
    generalPane.add(labelLabel, null);
    generalPane.add(label, null);

    generalPane.add(pushButtonType, null);
    generalPane.add(checkBoxButtonType, null);
    generalPane.add(radioButtonType, null);
    
    generalPane.add(selected, null);

    generalPane.add(trailingText, null);

    generalPane.add(aidLinkLabel, null);
    generalPane.add(aidLink, null);
    
    generalScroller.getViewport().add( generalPane, null );
    generalTab.setLayout(generalLayout);
    generalTab.add( generalScroller, BorderLayout.CENTER );
    
    this.add(propertySheet, BorderLayout.CENTER);
    propertySheet.add(generalTab, "General");
  }
  
  public void inspect( Object toDisplay ) {
    if ( toDisplay instanceof ButtonView ) {
      view = (IEditableElement) toDisplay;
      revert();
    } else 
      throw new RuntimeException("Invalid Graphic element to display:" + toDisplay );
  }
  
  public void accept() {
    if ( view == null )
      return;
      
    store.put( ButtonView.LABEL_PROP, label.getText() );
    store.put( ButtonView.TYPE_PROP, new Integer(getButtonTypeSelected()) );
    store.put( ButtonView.RIGHT_SIDE_PROP, BooleanUtils.toBoolean(trailingText.isSelected()) );
    store.put( ButtonView.SELECTED_PROP, BooleanUtils.toBoolean(selected.isSelected()) );

    store.put( ButtonView.AID_PROP,  aidLink.getText() );

    PropertiesChange cmd = new PropertiesChange( editor, view, store );
    cmd.executeIfRequired();
  }
  
  public void revert() {
    if ( view == null )
      return;
      
    store.clear();
    view.getProperties( store );  
    
    aidLink.setText( (String) store.get( ButtonView.AID_PROP ) );   
    label.setText( (String) store.get(ButtonView.LABEL_PROP) );
    Integer kind = (Integer) store.get( ButtonView.TYPE_PROP );
    setButtonTypeToSelect( kind.intValue() );
    selected.setSelected( BooleanUtils.toPrimitive(store.get(ButtonView.SELECTED_PROP)) );
    trailingText.setSelected( BooleanUtils.toPrimitive(store.get(ButtonView.RIGHT_SIDE_PROP)) );
  }
  
  public Object getObjectUnderInspection() {
    return view;
  }

  private void setButtonTypeToSelect( int val ) {
    switch ( val ) {
      case ButtonView.PUSH: pushButtonType.setSelected( true ); break;
      case ButtonView.CHECKBOX: checkBoxButtonType.setSelected( true ); break;
      default:
        radioButtonType.setSelected( true ); break;
    }
  }
    
  private int getButtonTypeSelected() {
    if ( pushButtonType.isSelected() )
      return ButtonView.PUSH;
    if ( checkBoxButtonType.isSelected() )
      return ButtonView.CHECKBOX;
    return ButtonView.RADIO;
  }
  
//  static public void main( String[] args ) {
//    JFrame form = new JFrame( "test" );
//    ButtonSheet sheet = new ButtonSheet();
//    form.getContentPane().add( sheet );
//    form.show();
//  }
}
